package co.com.bean.pais;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.annotation.Resource;
import javax.ejb.SessionContext;
import javax.ejb.Stateless;

import co.com.smart.maestro.infraestructure.dto.PaisDTO;
import co.com.smart.maestro.infraestructure.dto.ResponseJson;
import co.com.smart.mapper.Mapper;
import co.com.smart.persistence.entity.PaisFacadeLocal;
import co.com.smart.persistence.entity.dto.SmartPais;
import co.com.smart.session.DelegateContextEJB;
import co.com.smart.utilidades.Constantes;

/**
 * Session Bean implementation class PaisBean
 */
@Stateless(mappedName = "ejb/PaisBean")
public class PaisBean implements PaisBeanLocal{
	private PaisFacadeLocal facade;

	@Resource
	private SessionContext session;
	
	public PaisBean() {
		facade = DelegateContextEJB.getPaisFacadeLocal();
	}

	@Override
	public ResponseJson insertarPais(PaisDTO paisDTO) {

		ResponseJson response = new ResponseJson(); 
		try {
			//paisDTO.setCousuario(session.getCallerPrincipal().getName());
			paisDTO.setFhingreso(new Date());
			paisDTO.setFhmodificacion(new Date());
			System.out.println(paisDTO.getCousuario());
			facade.create(Mapper.mapperDtoToSmartPais(paisDTO));
			response.setCodigo(Constantes.StatusResponse.OK.getStatus());
			response.setMensaje(Constantes.MensajeResponse.MSJ_OK.getMensajeStatuss()+ "Pais almacenado.");
			response.setMensajeInterno(Constantes.MensajeResponse.MSJ_OK.getMensajeStatuss()+ "Pais almacenado.");
		} catch (Throwable e) {
			System.err.println("Error insertando el pais -> " + e.getMessage());
			response.setCodigo(Constantes.StatusResponse.ERROR.getStatus());
			response.setMensaje(Constantes.MensajeResponse.MSJ_ERROR.getMensajeStatuss()+ "No fue posible almacenar el pais.");
			response.setMensajeInterno(Constantes.MensajeResponse.MSJ_ERROR.getMensajeStatuss()+e.getMessage());
		}

		return response ;
	}

	@Override
	public List<PaisDTO> consultarAllPais(){
		List<PaisDTO> pais = new ArrayList<PaisDTO>();
		for (SmartPais entity : facade.findAll()) {
			if(entity.getSmFhretiro() == null){
				pais.add(Mapper.mapperSmartPaisToDto(entity));
			}
		}

		return pais;
	}

	@Override
	public PaisDTO consultarPaisId(PaisDTO paisDto) {
		PaisDTO pais = new PaisDTO();
		SmartPais entity  = facade.find(paisDto.getScpais());
		if(entity != null && entity.getSmFhretiro() == null){
			pais = Mapper.mapperSmartPaisToDto(entity);
		}
		return pais;
	}

	@Override
	public ResponseJson editPais(PaisDTO pais) {
		ResponseJson response = new ResponseJson(); 
		try {
			pais.setFhmodificacion(new Date());
			facade.edit(Mapper.mapperDtoToSmartPais(pais));
			response.setCodigo(Constantes.StatusResponse.OK.getStatus());
			response.setMensaje(Constantes.MensajeResponse.MSJ_OK.getMensajeStatuss()+ "Pais editado.");
			response.setMensajeInterno(Constantes.MensajeResponse.MSJ_OK.getMensajeStatuss()+ "Pais editado.");
		} catch (Throwable e) {
			System.err.println("Error editando el pais -> " + e.getMessage());
			response.setCodigo(Constantes.StatusResponse.ERROR.getStatus());
			response.setMensaje(Constantes.MensajeResponse.MSJ_ERROR.getMensajeStatuss()+ "No fue posible editar el pais.");
			response.setMensajeInterno(Constantes.MensajeResponse.MSJ_ERROR.getMensajeStatuss()+e.getMessage());
		}

		return response ;
	}

	@Override
	public ResponseJson removePais(PaisDTO pais,  boolean logic) {
		ResponseJson response = new ResponseJson(); 
		if(logic){
			try {
				pais.setFhretiro(new Date());
				pais.setFhmodificacion(new Date());
				facade.edit(Mapper.mapperDtoToSmartPais(pais));
				response.setCodigo(Constantes.StatusResponse.OK.getStatus());
				response.setMensaje(Constantes.MensajeResponse.MSJ_OK.getMensajeStatuss()+ "Pais inactivado");
				response.setMensajeInterno(Constantes.MensajeResponse.MSJ_OK.getMensajeStatuss()+ "Pais inactivado.");
			} catch (Throwable e) {
				System.err.println("Error editando el pais -> " + e.getMessage());
				response.setCodigo(Constantes.StatusResponse.ERROR.getStatus());
				response.setMensaje(Constantes.MensajeResponse.MSJ_ERROR.getMensajeStatuss()+ "No fue posible inactivar el pais.");
				response.setMensajeInterno(Constantes.MensajeResponse.MSJ_ERROR.getMensajeStatuss()+e.getMessage());
			}
		}else{
			try {
				facade.remove(Mapper.mapperDtoToSmartPais(pais));
				response.setCodigo(Constantes.StatusResponse.OK.getStatus());
				response.setMensaje(Constantes.MensajeResponse.MSJ_OK.getMensajeStatuss()+ "Pais eliminado");
				response.setMensajeInterno(Constantes.MensajeResponse.MSJ_OK.getMensajeStatuss()+ "Pais eliminado.");
			} catch (Throwable e) {
				System.err.println("Error eliminando el pais -> " + e.getMessage());
				response.setCodigo(Constantes.StatusResponse.ERROR.getStatus());
				response.setMensaje(Constantes.MensajeResponse.MSJ_ERROR.getMensajeStatuss()+ "No fue posible eliminar el pais.");
				response.setMensajeInterno(Constantes.MensajeResponse.MSJ_ERROR.getMensajeStatuss()+e.getMessage());
			}
		}
		return response ;
	}
}
